package com.gitee.kenewstar.common;

import com.gitee.kenewstar.utils.AssertUtil;
import com.gitee.kenewstar.utils.ObjectUtil;
import com.gitee.kenewstar.utils.ReflectUtil;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

/**
 * 参数转换器
 *
 * @author kenewstar
 * @date 2022/2/22
 */
public interface ParamConverter {

	/**
	 * 将map集合中的参数转换为目标对象
	 *
	 * @param paramMap 参数映射集合
	 * @param targetClz 目标类型
	 * @param <T> 范型
	 * @return 目标对象类型
	 */
	default <T> T mapToObj(Map<String, Object> paramMap, Class<T> targetClz) {
		AssertUtil.notNull(paramMap);

		// 创建目标对象
		T target = ObjectUtil.createObj(targetClz);
		// 获取所有属性
		Set<Field> fields = ReflectUtil.getAllFields(targetClz);
		// 属性注入值
		fields.forEach(field -> autowireFieldValue(target, field, paramMap.get(field.getName())));

		return target;
	}

	/**
	 * 注入属性值
	 *
	 * @param target 目标对象
	 * @param field 属性对象
	 * @param value 注入值
	 */
	default void autowireFieldValue(Object target, Field field, Object value) {
		field.setAccessible(true);
		try {
			if (Objects.nonNull(value)) {
				field.set(target, value);
			}
		} catch (IllegalAccessException e) {
			AssertUtil.throwException("field set failed ", e);
		}
	}




}
